package pe.com.casadesign.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.com.casadesign.dao.BultoDAO;
import pe.com.casadesign.domain.Bulto;
import pe.com.casadesign.domain.Guia;
import pe.com.casadesign.domain.Inventario;
import pe.com.casadesign.domain.Item;
import pe.com.casadesign.domain.LineaDetalleBulto;
import pe.com.casadesign.domain.LineaGuia;
import pe.com.casadesign.domain.LineaGuiaItem;
import pe.com.casadesign.domain.LineaInventarioBulto;
import pe.com.casadesign.domain.ListaBulto;
import pe.com.casadesign.domain.ListaLineaDetalleBulto;
import pe.com.casadesign.domain.ListaLineaInventarioBulto;
import pe.com.casadesign.domain.ListaLineaSolicitudBulto;
import pe.com.casadesign.domain.OperacionError;
import pe.com.casadesign.domain.OperacionResultado;
import pe.com.casadesign.domain.Producto;
import pe.com.casadesign.service.BultoService;
import pe.com.casadesign.service.util.Constantes;

/**
 * Implementacion de BultoService.
 * 
 * @author Pedro Vera
 * 
 */
@Service
public class BultoServiceImpl implements BultoService {
	private static final Logger logger = LoggerFactory.getLogger(ClienteServiceImpl.class);

    @Autowired
    private BultoDAO bultoDAO;
    
	@Override
	public ListaBulto listarBultoPorProducto(Producto producto, Bulto bulto) {
		return bultoDAO.listarBultoPorProducto(producto, bulto);
	}

	@Override
	public Bulto obtenerBultoContenido(Bulto bulto){
		return bultoDAO.obtenerBultoContenido(bulto);
	}
	
	@Override
	public Bulto obtenerBultoComponente(Bulto bulto){
		return bultoDAO.obtenerBultoComponente(bulto);
	}
	
	@Override
	public Bulto consultarBultoContenido(Bulto bulto){
		return bultoDAO.consultarBultoContenido(bulto);
	}
	
	@Override
	public OperacionResultado validarBulto(Bulto bulto){
		OperacionError operacionError = null;
		OperacionResultado operacionResultado = null;
		// Instanciando operacionResultado
	    operacionResultado = new OperacionResultado();
		operacionResultado.setEsOK(Constantes.NO);
			
		boolean resultado = bultoDAO.validarBulto(bulto) > 0;
		operacionResultado.setCodigoGenerado(String.valueOf(bulto.getCodBulto()));
		operacionResultado.setEsOK(resultado ? Constantes.SI : Constantes.NO);

		return operacionResultado;
	}
	
	@Override
	public OperacionResultado registrarBulto(Bulto bulto) {
		boolean resultado = bultoDAO.registrarBulto(bulto);
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(bulto.getCodBulto()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	public OperacionResultado procesarBulto(Bulto bulto) {
		OperacionError operacionError = null;
		OperacionResultado operacionResultado = null;
		boolean resultado = false;
		
		// Instanciando operacionResultado
				operacionResultado = new OperacionResultado();
				operacionResultado.setEsOK(Constantes.NO);
				
		// Obteniendo la lista de lineas del inventario
		ListaLineaDetalleBulto listaLineaDetalleBulto = bulto.getListaLineaDetalleBulto();
		
		for (LineaDetalleBulto lineaDetalleBulto : listaLineaDetalleBulto.getLista())
		{		
				// Registrar bulto en el inventario
				resultado = bultoDAO.registrarDetalleBulto(lineaDetalleBulto);
				operacionResultado .setCodigoGenerado(String.valueOf(lineaDetalleBulto.getBulto().getCodBulto()));
				operacionResultado .setEsOK(resultado ? Constantes.SI : Constantes.NO);
		}
		
    	return operacionResultado;
	}


	@Override
	@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public OperacionResultado modificarEstadoBulto(Bulto bulto) {
		boolean resultado = bultoDAO.modificarEstadoBulto(bulto)>0;
		
		OperacionResultado operacionResultado = new OperacionResultado();
		operacionResultado.setCodigoGenerado(String.valueOf(bulto.getCodBulto()));
		operacionResultado.setEsOK(resultado?Constantes.SI:Constantes.NO);
		
		return operacionResultado;
	}
	
	@Override
	public Bulto obtenerBulto(Bulto bulto) {
		return bultoDAO.obtenerBulto(bulto);
	}

	@Override
	public ListaBulto listarBultoTienda(Bulto bulto) {
		return bultoDAO.listarBultoTienda(bulto);
	}

}